#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#define MYSIG SIGRTMIN+5
int flag = 1;

//信号响应函数 
/**************************** CodeGeeX Inline Diff ****************************/
void new_act(int signum, siginfo_t * info, void * myact)  
{  
    // 打印信号编号
    printf("new_act=%d\n", signum);  
    // 打印从发送端传过来的数据，两个值相同
    printf("new_act->%d,%d\n", info->si_int,info->si_value.sival_int);  
    // 如果从发送端传过来的数据为9，则将flag置为0
    printf("new_act->%d,%d\n", info->si_int,info->si_value.sival_int);  /*从发送端传过来的数据，两个值相同*/
    // 如果信号编号为9，则将flag置为0
    if(info->si_int == 9)
    {
        flag = 0; 
    }
}  


int main(int argc,char *argv[])
{
    int controid = 0;
    // int signo=2;  
    int signo=MYSIG;  
    pid_t pid;
    struct sigaction myAct;       //指明对信号响应的设置信息
    
    pid = getpid();// 调用getpid函数的进程是什么，就返回该进程的ID
    printf("process id is %d,%d\r\n",pid, signo);
/*
struct sigaction
{ 
    void (*sa_handler)(int); 
    void (*sa_sigaction)(int, siginfo_t *, void *); 
    sigset_t sa_mask; 
    int  sa_flags; 
    void(*sa_restorer)(void); 
};
*/
    //标识指明，信号响应函数可以使用传输过来的参数  
    //使用sa_sigaction成员而不是sa_handler作为信号处理函数。
    myAct.sa_flags=SA_SIGINFO;  
    //指明信号响应函数   
    myAct.sa_sigaction=new_act;  
    //安装信号，为MYSIG设置响应函数 
    if(sigaction(signo, &myAct, NULL)<0)  
    {  
        printf("sigaction fail\n");  
    }  
  
    while(flag)  
    {  
        controid++;  
        sleep(2);  
        printf("sleep \n"); 
        if (controid == 10)
        {
            raise(signo);
            printf("send signal %d\n", signo);
        }
         
    }  
    return 0;
}